package jp.oesf.malfoy.xml;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.content.Context;
import android.net.ParseException;
import android.util.Log;
import android.util.Xml;



public class XmlParser {
	private static final String TAG = "XmlParser";
	private static XmlParser xmlParser = new XmlParser();

	/**
	 * This class is singleton.
	 */
	private XmlParser() {
	}

	/**
	 * インスタンスの取得。
	 * 
	 * @return このクラスのインスタンス
	 */
	public static XmlParser getInstance() {
		
		return xmlParser;
	}

	public ArrayList parseSax(Context context, String xml) {
		RowModel rowModel = null;
		InputStream is = null;
		try {
			// 解析対象のストリームを取得する
			is = context.getAssets().open("sample.xml");
		
			// パーサのFactoryを作成
			SAXParserFactory saxParaser = SAXParserFactory.newInstance();

			// TODO 【SAX】 No.05  パーサを取得
			SAXParser sp = saxParaser.newSAXParser();
			// TODO 【SAX】 No.06 イベントハンドラを作成
			SaxHandler sh = new SaxHandler();

			// TODO 【SAX】 No.07 イベントハンドラに入力データとイベントハンドラを渡す
			sp.parse(is, sh);
			
			return sh.list;
		} catch(ParseException e){
			e.printStackTrace();
		} catch (Exception e) {
			Log.e(TAG, Log.getStackTraceString(e));
			e.printStackTrace();
		}
		return null;
	}
	
	class SaxHandler extends DefaultHandler {
		ArrayList<RowModel> list = new ArrayList<RowModel>();	
		ItemRow[] itemrow = new ItemRow[10];
		int itemcnt = 0;
		int itemflg = 0;

		//タグ開始フラグ
		
		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			
			//itemタグまでを読み飛ばし
			if ("rss".equals(localName)){
				itemflg = 1;
					return;
			}else if("channel".equals(localName)){
					itemflg = 1;
						return;
			}
			if ("item".equals(localName)) {
			// item タグの開始

				if(itemflg!=1)itemcnt++;
				itemflg = 0;

//				Log.v(TAG, "XXXXXisTitle-c itencnt " + itemcnt);	
				
				itemrow[itemcnt] = new ItemRow();
				itemrow[itemcnt].isItem = true;
				itemrow[itemcnt].isTitle = false;
				itemrow[itemcnt].isLink = false;
				itemrow[itemcnt].isDescription = false;
				itemrow[itemcnt].isPubDate = false;
				itemrow[itemcnt].isCategory = false;
			}
			//itemタグの中にいるか判定

			if (itemrow[itemcnt].isItem) {
				if ("title".equals(localName)){
					itemrow[itemcnt].isTitle = true;
//					Log.v(TAG, "isTitle " + itemrow[itemcnt].isTitle);
					}
//					Log.v(TAG, "1 " + localName);

				if ("link".equals(localName)){
					itemrow[itemcnt].isLink = true;
//					Log.v(TAG, "isLink " + itemrow[itemcnt].isLink);
					}
//					Log.v(TAG, "2 " + localName);

				if ("description".equals(localName)){
					itemrow[itemcnt].isDescription = true;
//					Log.v(TAG, "isDescription " + itemrow[itemcnt].isDescription);
					}
//					Log.v(TAG, "3 " + localName);

				if ("pubDate".equals(localName)){
					itemrow[itemcnt].isPubDate = true;
//					Log.v(TAG, "isPubDate " + itemrow[itemcnt].isPubDate);	
					}
//					Log.v(TAG, "4 " + localName);
			
				if ("category".equals(localName)){
					itemrow[itemcnt].isCategory = true;
//					Log.v(TAG, "isCategory " + itemrow[itemcnt].isCategory);
//					itemrow[itemcnt].isItem = false;
					}
//					Log.v(TAG, "5 " + localName);
			}
		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			
//			if ("item".equals(localName)) {				//rowModelに値を設定する 
			if(itemrow[itemcnt].category != null){
			for(int i = 0;i<=itemcnt;i++){
					RowModel rowModel = new RowModel();
//				if(itemrow[i].title==null){
					rowModel.setTitle(itemrow[i].title);
					rowModel.setLink(itemrow[i].link);
					rowModel.setDescription(itemrow[i].description);
					rowModel.setPubDate(itemrow[i].pubDate);
					rowModel.setCategory(itemrow[i].category);
/*
					Log.v(TAG, "isTitle-end0 " + itemrow[0].title);						
					Log.v(TAG, "isTitle-end0 " + itemrow[0].link);			
					Log.v(TAG, "isTitle-end0 " + itemrow[0].description);		
					Log.v(TAG, "isTitle-end0 " + itemrow[0].pubDate);		
					Log.v(TAG, "isTitle-end0 " + itemrow[0].category);
					Log.v(TAG, "isTitle-end1 " + itemrow[1].title);						
					Log.v(TAG, "isTitle-end1 " + itemrow[1].link);			
					Log.v(TAG, "isTitle-end1 " + itemrow[1].description);		
					Log.v(TAG, "isTitle-end1 " + itemrow[1].pubDate);		
					Log.v(TAG, "isTitle-end1 " + itemrow[1].category);	
*/
					//値をクリア

					itemrow[i].title = null;
					itemrow[i].link = null;
					itemrow[i].description = null;
					itemrow[i].pubDate = null;
					itemrow[i].category = null;
					itemrow[i].isItem =false;

					list.add(rowModel);		
//				}
				}
			}
		}
		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			
//			Log.v(TAG, "isTitle-cXXXXX itencnt " + itemcnt);	
			if(itemflg == 1)return;
//			try{
//			Log.v(TAG, "isTitle-cXXXX " + itemrow[itemcnt].isItem);	
			if (itemrow[itemcnt].isItem) {
				if (itemrow[itemcnt].isTitle) {
					//titleを取得する
					itemrow[itemcnt].title = new String(ch, start, length);
					itemrow[itemcnt].isTitle = false;
//					Log.v(TAG, "isTitle-c " + itemrow[itemcnt].title);						
				}
				if (itemrow[itemcnt].isLink) {
					//linkを取得する
					itemrow[itemcnt].link = new String(ch, start, length);
					itemrow[itemcnt].isLink = false;
//					Log.v(TAG, "isLink-c " + itemrow[itemcnt].link);
				}				
				if (itemrow[itemcnt].isDescription) {
					//descriptionを取得する
					itemrow[itemcnt].description = new String(ch, start, length);
					itemrow[itemcnt].isDescription = false;
//					Log.v(TAG, "isDescription-c " + itemrow[itemcnt].description);
				}
				if (itemrow[itemcnt].isPubDate) {
					//pubDateを取得する
					itemrow[itemcnt].pubDate = new String(ch, start, length);
					itemrow[itemcnt].isPubDate = false;
//					Log.v(TAG, "isPubDate-c " + itemrow[itemcnt].pubDate);

				}
//				Log.v(TAG, "isCategory-caa " + itemrow[itemcnt].isCategory);
				if (itemrow[itemcnt].isCategory) {
					//categoryを取得する
					itemrow[itemcnt].category = new String(ch, start, length);
//					Log.v(TAG, "isCategory-c " + itemrow[itemcnt].category);
					itemrow[itemcnt].isCategory = false;
					itemrow[itemcnt].isItem = false;
//					Log.v(TAG, "isTitle-ca itencnt " + itemcnt);		
				}
//			}
//			}catch(NullPointerException e){
//				return;
			}
			Log.v(TAG, "isTitle-c " + itemcnt);			
			Log.v(TAG, "isTitle-c " + itemrow[itemcnt].title);						
			Log.v(TAG, "isTitle-c " + itemrow[itemcnt].link);			
			Log.v(TAG, "isTitle-c " + itemrow[itemcnt].description);		
			Log.v(TAG, "isTitle-c " + itemrow[itemcnt].pubDate);		
			Log.v(TAG, "isTitle-c " + itemrow[itemcnt].category);
		}
	}
}

class ItemRow{
	public boolean isItem = false;;
	public boolean isTitle = false;
	public boolean isLink = false;
	public boolean isDescription = false;
	public boolean isPubDate = false;
	public boolean isCategory = false;
	public String title = null;
	public String link = null;
	public String description = null;
	public String pubDate = null;
	public String category = null;
}